/**
 * 
 */
package jtierno.organizadorMaterias.model;

import java.util.HashSet;
import java.util.Observable;
import java.util.Observer;
import java.util.Set;

/**
 * @author jonathan
 * 
 */
public class Materia extends Observable implements Observer{

	private String codigo;
	private String descripcion;
	private Estado estado;
	private Integer creditos;
	private Set<Materia> materiasPredecesoras;
	
	
	public Materia(){
		super();
		materiasPredecesoras = new HashSet<Materia>();
		estado = Estado.NO_HABILITADA;
	}
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
		setChanged();
		notifyObservers();
	}

	public Integer getCreditos() {
		return creditos;
	}

	public void setCreditos(Integer creditos) {
		this.creditos = creditos;
	}

//	@Override
//	public boolean equals(Object obj) {
//		Materia otraMateria = (Materia) obj;
//		return otraMateria.getCodigo().equals(this.getCodigo())
//				&& otraMateria.getCreditos().equals(this.creditos)
//				&& otraMateria.getDescripcion().equals(getDescripcion())
//				&& otraMateria.getEstado().equals(getEstado());
//	}

//	@Override
//	public int hashCode() {
//		Integer result = 17;
//		result = 37 * result + getCodigo().hashCode();
//		result = 37 * result + getCreditos().hashCode();
//		result = 37 * result + getDescripcion().hashCode();
//		result = 37 * result + getEstado().hashCode();
//		return result;
//	}
	
	public void addMateriaPredecesora(Materia materia){
		materiasPredecesoras.add(materia);
		materia.addObserver(this);
	}
	
	public void update(Observable o, Object arg) {
		Boolean habilitada = true;
		for (Materia materia : materiasPredecesoras) {
			if(!materia.getEstado().equals(Estado.APROBADA)){
				habilitada = false;
				break;
			}
		}
		if(habilitada && estado.equals(Estado.NO_HABILITADA)){
			setEstado(Estado.HABILITADA);
		}
	}
	
	public void quitarPredecesora(Materia materia){
		materiasPredecesoras.remove(materia);
		materia.deleteObserver(this);
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return getDescripcion();
	}
}
